<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>

</body>
<script>
  // 继承   让一个类(构造函数)  继承 另一个类(构造函数)  的 属性和方法(实例的相关属性和方法 以及 原型对象上相关属性和方法)  或者重新定义、追加属性和方法等。
  // 被继承的类 父类
  // 继承的类   子类

  // 目的:  实现属性和方法的复用


  // 原型继承: 
  // 通过拓宽原型链,达到继承父类原型对象方法的目的 (用父类实例化对象 覆盖子类的原型对象 => 要原型链)


  // 缺点: 
  // 


  function Person(name, age) {
    this.name = name;
    this.age = age;
  }

  Person.prototype.species = "human";
  Person.prototype.skill = function () {
    console.log("thinking");
  }
  Person.prototype.say = function () {
    console.log(this.name, this.age);
  }

  // p的原型链: p -> Person.prototype -> Object.prototype -> null
  var p = new Person("张三", 18);
  console.log(p);




  function YellowPerson(name, age, hobby) {
    // this.name = name;
    // this.age = age;

    Person.call(this, name, age);

    this.hobby = hobby;
  }

  // 最简单的原型继承(最low)
  // 改动前:
  // p的原型链:    p -> Person.prototype -> Object.prototype -> null
  // yp 的原型链: yp -> YellowPerson.prototype -> Object.prototype -> null

  // 改动后:
  // yp 的原型链: yp -> YellowPerson.prototype(p) -> Person.prototype -> Object.prototype -> null

  // 浅复制 => YellowPerson.prototype Person.prototype 引用同一个内存空间 只要有一个改动 另一个也会被修改
  // YellowPerson.prototype = new Person("张三",18); 

  // YellowPerson.prototype = p = {
  //     name:"张三",  
  //     age:18, 
  //     [[prototype]]:Person.prototype
  // }

  // 中间件继承 => 原型继承的升级版 
  // 目的: 得到一个纯净的对象  => 原型属性 指向Person.Prototype
  // {
  //     [[prototype]]:Person.prototype
  // }

  function Fn() { }
  Fn.prototype = Person.prototype;

  // new Fn() = {
  //     [[prototype]]:Fn.prototype( Person.prototype)
  // }
  YellowPerson.prototype = new Fn();
  YellowPerson.prototype.constructor = YellowPerson;




  // YellowPerson.prototype.species = "human";
  // YellowPerson.prototype.skill = function(){
  //     console.log("thinking");
  // }
  // YellowPerson.prototype.say = function(){
  //     console.log(this.name,this.age);
  // }

  YellowPerson.prototype.say = function () {
    console.log(this.name, this.age, this.hobby);
  }
  YellowPerson.prototype.speak = function () {
    console.log("chinese");
  }

  // yp 的原型链: yp -> YellowPerson.prototype -> Object.prototype -> null
  var yp = new YellowPerson("张三", 18, "唱歌");
  console.log(yp);

    // console.log(yp.species);
    // yp.say();
    // yp.skill();







</script>

</html>